//#include <muduo/net/EventLoop.h>
//#include <muduo/net/TcpServer.h>
//#include <iostream>
//#include <functional>
//#include <unordered_map>
//#include <algorithm> // 添加算法头文件
//
//class DictServer
//{
//public:
//  DictServer(int16_t port) : _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port),
//        "DictServer", muduo::net::TcpServer::Option::kReusePort)
//  {
//    _server.setConnectionCallback(std::bind(&DictServer::onConnect, this, std::placeholders::_1));
//    _server.setMessageCallback(std::bind(&DictServer::onMessage, this, 
//          std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
//  }
//  
//  void Start()
//  {
//    std::cout << "服务器启动，监听端口：" << _server.ipPort() << std::endl;
//    _server.start();
//    _baseloop.loop();
//  }
//  
//  ~DictServer(){}
//  
//private:
//  void onConnect(const muduo::net::TcpConnectionPtr &conn)
//  {
//    if(conn->connected())
//    {
//      std::cout << "新连接建立: " << conn->peerAddress().toIpPort() << std::endl;
//    }
//    else
//    {
//      std::cout << "连接关闭: " << conn->peerAddress().toIpPort() << std::endl;
//    }
//  }
//  
//  std::string translate(std::string word)
//  {
//    // 转换为小写并去除首尾空格
//    std::transform(word.begin(), word.end(), word.begin(), ::tolower);
//    word.erase(0, word.find_first_not_of(' '));
//    word.erase(word.find_last_not_of(' ') + 1);
//    
//    static const std::unordered_map<std::string, std::string> dict = {
//      {"hello", "你好"},
//      {"你好", "hello"},
//      {"world", "世界"},
//      {"世界", "world"},
//      {"apple", "苹果"},
//      {"苹果", "apple"}
//    };
//    
//    auto pos = dict.find(word);
//    return (pos != dict.end()) ? pos->second : "未找到翻译";
//  }
//  
//  void onMessage(const muduo::net::TcpConnectionPtr &conn, 
//                 muduo::net::Buffer *buf, 
//                 muduo::Timestamp t)
//  {
//    // 添加安全判断：确保缓冲区有数据
//  if (buf->readableBytes() == 0) return;
//
//  // 使用换行符分割消息
//  while (buf->findCRLF()) {
//    std::string message = buf->retrieveAllAsString();
//    
//    // 安全移除换行符
//    if (!message.empty() && message[message.size()-1] == '\n') {
//      message.pop_back(); // 移除\n
//    }
//    if (!message.empty() && message[message.size()-1] == '\r') {
//      message.pop_back(); // 移除\r
//    }
//    
//    std::cout << "收到请求: " << message << std::endl;
//    std::string rep = translate(message);
//    std::cout << "返回响应: " << rep << std::endl;
//    
//    conn->send(rep + "\r\n");
//  }
//  }
//private:
//  muduo::net::EventLoop _baseloop;
//  muduo::net::TcpServer _server;
//};
//
//int main()
//{
//  DictServer server(8080);
//  server.Start();
//  return 0;
//}
#include<muduo/net/EventLoop.h>
#include<muduo/net/TcpServer.h>
#include<iostream>
#include<functional>
#include<unordered_map>
class DictServer
{
public:
  DictServer(int16_t port):_server(&_baseloop,muduo::net::InetAddress("0.0.0.0",port)
            ,"DictServer",muduo::net::TcpServer::Option::kReusePort)
  {
    //因为类内函数会自带this指针，通过bind可以让函数适应不同场景
    _server.setConnectionCallback(std::bind(&DictServer::onConnect,this,std::placeholders::_1));
    _server.setMessageCallback(std::bind(&DictServer::onMessage,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
  }
  void Start()
  {
    _server.start();//启动服务
    _baseloop.loop();//开启事件监控，epoll
  }
  ~DictServer(){}
private:
  //对监听事件的回调函数
  void onConnect(const muduo::net::TcpConnectionPtr &conn)
  {
    if(conn->connected()==true)
    {
      std::cout<<"connect success\n";
    }
    else
    {
      std::cout<<"client quit\n";
    }
  }
  //处理请求
  std::string translate(std::string& word)
  {
    static std::unordered_map<std::string,std::string> dict=
    {
      {"Hello", "你好"}, 
      {"你好", "Hello"}, 
      {"World", "世界"}, 
      {"世界", "World"}
    };
    auto pos = dict.find(word);
    if(pos==dict.end())
    {
      return "not find";
    }
    return pos->second;
  }
  //对io事件处理的回调函数
  void onMessage(const muduo::net::TcpConnectionPtr &conn,  
                muduo::net::Buffer *buf, 
                muduo::Timestamp t)
  {
    std::string message = buf->retrieveAllAsString();//获取需要进行处理的请求
    //对请求进行处理
    std::string rep = translate(message);
    //发送应答
    conn->send(rep);
  }
private:
  muduo::net::EventLoop _baseloop;
  muduo::net::TcpServer _server;
};

int main()
{
  DictServer server(8080);
  server.Start();
  return 0;
}
